﻿using System;
using System.Collections.Generic;

namespace UniSender
{
    using Expando = Dictionary<string, object>;

    partial class Client
    {
		/// <summary>
        /// Получить отчёт о статусах доставки SMS-сообщений для заданной рассылки
		/// </summary>
        /// <param name="campaignId">Идентификатор кампании</param>
        /// <param name="changedScince">Возвращать все статусы адресов, изменившиеся начиная с указанного времени включительно</param>
        /// <param name="fieldIds">Список id дополнительных полей</param>
		/// <returns>Список статусов</returns>
		public virtual CampaignStats[] GetCampaignDeliveryStats(int campaignId, DateTime? changedScince, string[] fieldIds)
        {
            return Apply<Native.CampaignStats>("getCampaignDeliveryStats", new Expando()
                {
					{ "campaign_id", campaignId },
					{ "changed_since", changedScince.Stringify() },
					{ "field_ids", fieldIds }
                })
                .IfNotNull(result => Parser.ParseDeliveriesStats(result));
        }

        /// <summary>
        /// Получить отчёт о статусах доставки SMS-сообщений для заданной рассылки
        /// </summary>
        /// <param name="campaignId">Идентификатор кампании</param>
        /// <param name="changedScince">Возвращать все статусы адресов, изменившиеся начиная с указанного времени включительно</param>
        /// <returns>Список статусов</returns>
        public virtual CampaignStats[] GetCampaignDeliveryStats(int campaignId, DateTime? changedScince)
        {
            return GetCampaignDeliveryStats(campaignId, changedScince, null);
        }

        /// <summary>
        /// Получить отчёт о статусах доставки SMS-сообщений для заданной рассылки
        /// </summary>
        /// <param name="campaignId">Идентификатор кампании</param>
        /// <returns>Список статусов</returns>
        public virtual CampaignStats[] GetCampaignDeliveryStats(int campaignId)
        {
            return GetCampaignDeliveryStats(campaignId, null, null);
        }


		/// <summary>
        /// Получить отчёт о статусах доставки сообщений для заданной рассылки, сгруппированных по типам результата
		/// </summary>
        /// <param name="campaignId">Идентификатор кампании</param>
        /// <returns>Отчёт о статусах доставки</returns>
        public virtual CampaignAggregateStats GetCampaignAggregateStats(int campaignId)
        {
            return Apply<Native.CampaignAggregateStats>("getCampaignAggregateStats", new Expando()
                {
					{ "campaign_id", campaignId }
				})
                .IfNotNull(result => new CampaignAggregateStats(result));
        }


		/// <summary>
        /// Получить статистику переходов по ссылкам
		/// </summary>
        /// <param name="campaignId">Идентификатор кампании</param>
        /// <param name="group">Группировать результаты по посещенным ссылкам</param>
		/// <returns>Статистика переходов по ссылкам</returns>
		public virtual LinkStats[] GetVisitedLinks(int campaignId, bool group)
        {
            return Apply<Native.LinksStats>("getVisitedLinks", new Expando()
                {
					{ "campaign_id", campaignId },
					{ "group", group ? "1" : null }
                })
                .IfNotNull(result => Parser.ParseLinksStats(result));
        }
    }
}
